<?php
namespace common\models\workerman;

use GatewayWorker\Lib\Gateway;
use common\models\ModelErrorBase;
use common\helpers\ShowJson;

/**
 * Workerman、gatewayworker相关操作类
 */
class WebSocketBase extends ModelErrorBase
{
    public $workermanName = "workerman";
    
    /**
     * 根据终端唯一标识，获取连接的客户端ID
     * @param string $client_uid     自定义客户端唯一表示：可以是客户端携带参数或token或ip
     * @param string $project       指定项目
     * @return boolean
     */
    public function getClientId($client_uid, $project)
    {
        if (empty($client_uid) || empty($project)) {
            return false;
        }
        
        $this->setGatewayRegisterAddress($project);
        $client_ids = Gateway::getClientIdByUid($client_uid);
        if (empty($client_ids)) {
            return false;
        }
        $client_id = current($client_ids);
        return $client_id;
    }
    
    
    /**
     * 绑定客户端ID与终端标识
     * @param string $client_id     客户端编号
     * @param string $client_uid    客户端唯一标识
     * @param string $project       指定项目
     * @return boolean
     */
    public function bindClientId($client_id, $client_uid, $project)
    {
        if (empty($client_id) || empty($client_uid) || empty($project)) {
            return false;
        }
        
        $this->setGatewayRegisterAddress($project);
        Gateway::bindUid($client_id, $client_uid);
        return true;
    }
    
    
    /**
     * 发送消息给指定的客户端
     * @param string $client_id     客户端ID
     * @param string $message       消息内容
     * @param string $project       指定项目：如park
     * @return boolean
     */
    public function sendMessageToClient($client_id, $message, $project)
    {
        if (empty($client_id) || empty($message) || empty($project)) {
            $this->setError("param is empty");
            return false;
        }
        
        $this->setGatewayRegisterAddress($project);
        // 判断client_id是否在线
        $is_online = Gateway::isOnline($client_id);
        if (empty($is_online)) {
            $this->setError("client_id = {$client_id} 不在线，无法发送。");
            return false;
        }
        $message = ShowJson::encode($message);
        $send_res = Gateway::sendToClient($client_id, $message);
        if (empty($send_res)) {
            $this->setError("client_id = {$client_id} 发送失败。");
            return false;
        }
        return true;
    }
    
    
    /**
     * 检测客户端是否在线
     * @param string $client_id     客户端id
     * @param string $project
     * @return boolean
     */
    public function checkClientIsOnline($client_id, $project)
    {
        if (empty($client_id) || empty($project)) {
            $this->setError("param is empty");
            return false;
        }
        
        $this->setGatewayRegisterAddress($project);
        // 判断client_id是否在线
        $is_online = Gateway::isOnline($client_id);
        if (empty($is_online)) {
            $this->setError("client_id = {$client_id} 不在线，无法发送。");
            return false;
        }
        return true;
    }
    
    
    /**
     * 主动断开客户端的连接
     * @param string $client_id     客户端ID
     * @param string $project
     * @return boolean
     */
    public function closeClient($client_id, $project)
    {
        if (empty($client_id) || empty($project)) {
            $this->setError("param is empty");
            return false;
        }
        
        $this->setGatewayRegisterAddress($project);
        // 断开与client_id对应的客户端的连接
        Gateway::closeClient($client_id);
        return true;
    }
    
    
    /**
     * 设置gateway进程中，register服务的地址
     * @param string $project   指定workerman项目
     */
    private function setGatewayRegisterAddress($project)
    {
        if (empty($project)) {
            $this->setError("project is empty");
            return false;
        }
        Gateway::$registerAddress = \Yii::$app->params[$this->workermanName][$project]['register_address'];
        return true;
    }
}